﻿using System;

namespace Flagwind.Expressions
{
	/// <summary>
	/// 表示词素提取的结果结构。
	/// </summary>
	public struct TokenResult
	{
		#region 公共字段

		/// <summary>
		/// 获取当前词素提取结果后需要移动读取器指针的偏移量。
		/// </summary>
		public readonly int Offset;

		/// <summary>
		/// 获取当前词素提取结果对应的词素对象，如果为空(null)则表示当前位置对应的字面量不是对应提取器支持的词素。
		/// </summary>
		public readonly Token Token;

		#endregion

		#region 构造方法

		public TokenResult(int offset, Token token)
		{
			this.Offset = offset;
			this.Token = token;
		}

		#endregion

		#region 重写方法

		public override string ToString()
		{
			return $"[{this.Offset}] {this.Token}";
		}

		#endregion

		#region 静态方法

		/// <summary>
		/// 创建一个失败的提取结果。
		/// </summary>
		/// <param name="offset">指定的偏移量。</param>
		/// <returns>返回的失败提取结果。</returns>
		public static TokenResult Fail(int offset)
		{
			return new TokenResult(offset, null);
		}

		#endregion
	}
}